/*
	FluorineFx open source library 
	Copyright (C) 2007 Zoltan Csibi, zoltan@TheSilentGroup.com, FluorineFx.com 
	
	This library is free software; you can redistribute it and/or
	modify it under the terms of the GNU Lesser General Public
	License as published by the Free Software Foundation; either
	version 2.1 of the License, or (at your option) any later version.
	
	This library is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
	Lesser General Public License for more details.
	
	You should have received a copy of the GNU Lesser General Public
	License along with this library; if not, write to the Free Software
	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
using System;
using FluorineFx.Messaging.Api.Stream;

namespace FluorineFx.Messaging.Rtmp.Stream
{
    class SimplePlaylistController : IPlaylistController
    {
        #region IPlaylistController Members

        public int NextItem(IPlaylist playlist, int itemIndex)
        {
            if (itemIndex < 0)
                itemIndex = -1;

            if (playlist.IsRepeat)
                return itemIndex;

            if (playlist.IsRandom)
            {
                int lastIndex = itemIndex;
                if (playlist.Count > 1)
                {
                    // continuously generate a random number
                    // until you get one that was not the last...
                    Random rand = new Random();
                    while (itemIndex == lastIndex)
                    {
                        itemIndex = rand.Next(playlist.Count);
                    }
                }
                return itemIndex;
            }

            int nextIndex = itemIndex + 1;

            if (nextIndex < playlist.Count)
            {
                return nextIndex;
            }
            else if (playlist.IsRewind)
            {
                return playlist.Count > 0 ? 0 : -1;
            }
            else
            {
                return -1;
            }
        }

        public int PreviousItem(IPlaylist playlist, int itemIndex)
        {
            if (itemIndex > playlist.Count)
            {
                return playlist.Count - 1;
            }
            if (playlist.IsRepeat)
            {
                return itemIndex;
            }
            if (playlist.IsRandom)
            {
                Random rand = new Random();
                int lastIndex = itemIndex;
                // continuously generate a random number
                // until you get one that was not the last...
                while (itemIndex == lastIndex)
                {
                    itemIndex = rand.Next(playlist.Count);
                }
                lastIndex = itemIndex;
                return itemIndex;
            }
            int prevIndex = itemIndex - 1;
            if (prevIndex >= 0)
            {
                return prevIndex;
            }
            else if (playlist.IsRewind)
            {
                return playlist.Count - 1;
            }
            else
            {
                return -1;
            }
        }

        #endregion
    }
}
